/*
 * @(#)ByteCodes.java	1.22 07/03/21
 * 
 * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *  
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *  
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *  
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *  
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

package com.sun.tools.javac.jvm;

import com.sun.tools.javac.util.Version;

/** Bytecode instruction codes, as well as typecodes used as
 *  instruction modifiers.
 *
 *  <p><b>This is NOT part of any API supported by Sun Microsystems.  If
 *  you write code that depends on this, you do so at your own risk.
 *  This code and its internal interfaces are subject to change or
 *  deletion without notice.</b>
 */
@Version("@(#)ByteCodes.java	1.22 07/03/21")
public interface ByteCodes {
    // <editor-fold defaultstate="collapsed">

    /** Byte code instruction codes.
     */
    int illegal 	= -1,
	nop		= 0,
	aconst_null	= 1,
	iconst_m1	= 2,
	iconst_0 	= 3,
	iconst_1 	= 4,
	iconst_2 	= 5,
	iconst_3 	= 6,
	iconst_4 	= 7,
	iconst_5 	= 8,
	lconst_0 	= 9,
	lconst_1 	= 10,
	fconst_0 	= 11,
	fconst_1 	= 12,
	fconst_2 	= 13,
	dconst_0 	= 14,
	dconst_1 	= 15,
	bipush 		= 16,
	sipush		= 17,
	ldc1		= 18,
	ldc2		= 19,
	ldc2w		= 20,
	iload		= 21,
	lload		= 22,
	fload		= 23,
	dload		= 24,
	aload		= 25,
	iload_0 	= 26,
	iload_1 	= 27,
	iload_2 	= 28,
	iload_3 	= 29,
	lload_0 	= 30,
	lload_1 	= 31,
	lload_2 	= 32,
	lload_3 	= 33,
	fload_0 	= 34,
	fload_1 	= 35,
	fload_2 	= 36,
	fload_3 	= 37,
	dload_0 	= 38,
	dload_1 	= 39,
	dload_2 	= 40,
	dload_3 	= 41,
	aload_0 	= 42,
	aload_1 	= 43,
	aload_2 	= 44,
	aload_3 	= 45,
	iaload		= 46,
	laload		= 47,
	faload		= 48,
	daload		= 49,
	aaload		= 50,
	baload		= 51,
	caload		= 52,
	saload		= 53,
	istore		= 54,
	lstore		= 55,
	fstore		= 56,
	dstore		= 57,
	astore		= 58,
	istore_0 	= 59,
	istore_1 	= 60,
	istore_2 	= 61,
	istore_3 	= 62,
	lstore_0 	= 63,
	lstore_1 	= 64,
	lstore_2 	= 65,
	lstore_3 	= 66,
	fstore_0 	= 67,
	fstore_1 	= 68,
	fstore_2 	= 69,
	fstore_3 	= 70,
	dstore_0 	= 71,
	dstore_1 	= 72,
	dstore_2 	= 73,
	dstore_3 	= 74,
	astore_0 	= 75,
	astore_1 	= 76,
	astore_2 	= 77,
	astore_3 	= 78,
	iastore		= 79,
	lastore		= 80,
	fastore		= 81,
	dastore		= 82,
	aastore		= 83,
	bastore		= 84,
	castore		= 85,
	sastore		= 86,
	pop		= 87,
	pop2		= 88,
	dup		= 89,
	dup_x1		= 90,
	dup_x2		= 91,
	dup2		= 92,
	dup2_x1		= 93,
	dup2_x2		= 94,
	swap		= 95,
	iadd		= 96,
	ladd		= 97,
	fadd		= 98,
	dadd		= 99,
	isub		= 100,
	lsub		= 101,
	fsub		= 102,
	dsub		= 103,
	imul		= 104,
	lmul		= 105,
	fmul		= 106,
	dmul		= 107,
	idiv		= 108,
	ldiv		= 109,
	fdiv		= 110,
	ddiv		= 111,
	imod		= 112,
	lmod		= 113,
	fmod		= 114,
	dmod		= 115,
	ineg		= 116,
	lneg		= 117,
	fneg		= 118,
	dneg		= 119,
	ishl		= 120,
	lshl		= 121,
	ishr		= 122,
	lshr		= 123,
	iushr		= 124,
	lushr		= 125,
	iand		= 126,
	land		= 127,
	ior		= 128,
	lor		= 129,
	ixor		= 130,
	lxor		= 131,
	iinc		= 132,
	i2l		= 133,
	i2f		= 134,
	i2d		= 135,
	l2i		= 136,
	l2f		= 137,
	l2d		= 138,
	f2i		= 139,
	f2l		= 140,
	f2d		= 141,
	d2i		= 142,
	d2l		= 143,
	d2f		= 144,
	int2byte	= 145,
	int2char	= 146,
	int2short	= 147,
	lcmp		= 148,
	fcmpl		= 149,
	fcmpg		= 150,
	dcmpl		= 151,
	dcmpg		= 152,
	ifeq		= 153,
	ifne		= 154,
	iflt		= 155,
	ifge		= 156,
	ifgt		= 157,
	ifle		= 158,
	if_icmpeq	= 159,
	if_icmpne	= 160,
	if_icmplt	= 161,
	if_icmpge	= 162,
	if_icmpgt	= 163,
	if_icmple	= 164,
	if_acmpeq	= 165,
	if_acmpne	= 166,
	goto_		= 167,
	jsr		= 168,
	ret		= 169,
	tableswitch	= 170,
	lookupswitch	= 171,
	ireturn		= 172,
	lreturn		= 173,
	freturn		= 174,
	dreturn		= 175,
	areturn		= 176,
	return_		= 177,
	getstatic	= 178,
	putstatic	= 179,
	getfield	= 180,
	putfield	= 181,
	invokevirtual	= 182,
	invokespecial   = 183,
	invokestatic	= 184,
	invokeinterface	= 185,
	// ___unused___	= 186,
	new_		= 187,
	newarray	= 188,
	anewarray	= 189,
	arraylength	= 190,
	athrow		= 191,
	checkcast	= 192,
	instanceof_	= 193,
	monitorenter	= 194,
	monitorexit	= 195,
        wide            = 196,
	multianewarray	= 197,
	if_acmp_null    = 198,
        if_acmp_nonnull = 199,
        goto_w          = 200,
        jsr_w           = 201,
        breakpoint      = 202,
	ByteCodeCount   = 203;
    // </editor-fold>

    /** Virtual instruction codes; used for constant folding.
     */
    int string_add 	= 256,  // string +
	bool_not 	= 257,  // boolean !
	bool_and 	= 258,  // boolean &&
	bool_or 	= 259;  // boolean ||

    /** Virtual opcodes; used for shifts with long shiftcount
     */
    int ishll		= 270,  // int shift left with long count
	lshll		= 271,  // long shift left with long count
	ishrl		= 272,  // int shift right with long count
	lshrl		= 273,  // long shift right with long count
	iushrl		= 274,  // int unsigned shift right with long count
	lushrl		= 275;  // long unsigned shift right with long count

    /** Virtual opcode for null reference checks
     */
    int nullchk         = 276;  // return operand if non-null,
                                // otherwise throw NullPointerException.

    /** Virtual opcode for disallowed operations.
     */
    int error		= 277;

    /** All conditional jumps come in pairs. To streamline the
     *  treatment of jumps, we also introduce a negation of an
     *  unconditional jump. That opcode happens to be jsr.
     */
    int dontgoto        = jsr;

    /** Shift and mask constants for shifting prefix instructions.
     *  a pair of instruction codes such as LCMP ; IFEQ is encoded
     *  in Symtab as (LCMP << preShift) + IFEQ.
     */
    int preShift 	= 9;
    int preMask  	= (1 << preShift) - 1;

    /** Type codes.
     */
    //为什么字段INTcode到SHORTcode是按下面的顺序设置数字值呢？
    //因为虚拟机的字节码也是按大小(将字节码转化成10进制)排列的，
    /*如下的字节码指令：
    ------------------------
		iaload		= 46,
		laload		= 47,
		faload		= 48,
		daload		= 49,
		aaload		= 50,
		baload		= 51,
		caload		= 52,
		saload		= 53,
	------------------------
	刚好与下面的字段值顺序一致，这样在写程序时有时会很方便，
	参考Items类中的注释
		*/
    int INTcode 	= 0,
	LONGcode 	= 1,
	FLOATcode 	= 2,
	DOUBLEcode 	= 3,
	OBJECTcode 	= 4,
	BYTEcode 	= 5,
	CHARcode 	= 6,
	SHORTcode 	= 7,
	VOIDcode 	= 8,
	TypeCodeCount 	= 9;
	    
    //我重新调整了，方便调试
    static final String[] typecodeNames = {
	"INTcode",
	"LONGcode",
	"FLOATcode",
	"DOUBLEcode",
	"OBJECTcode",
	"BYTEcode",
	"CHARcode",
	"SHORTcode",
	"VOIDcode",
	"oops"
    };
    
	/*
    static final String[] typecodeNames = {
	"int",
	"long",
	"float",
	"double",
	"object",
	"byte",
	"char",
	"short",
	"void",
	"oops"
    };
    */
}

